package com.evil.common.application.dto.robot;

import cn.hutool.core.bean.BeanUtil;
import com.evil.common.application.dto.order.data.ControlDataValueDTO;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 机器人
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
@Data
public class RobotRuleDTO {

    /**
     * id
     */
    private Long robotRuleId;

    /**
     * 机器人规则类型（1-新增，2-修改）
     */
    @NotNull(message = "机器人规则类型不能为空")
    private Integer robotRuleType;

    /**
     * 源类型（1-流程节点）
     */
    private Integer sourceType;

    /**
     * 源id
     */
    private Long sourceId;

    /**
     * 规则目标id
     */
    @NotNull(message = "规则目标不能为空")
    private Long ruleTargetId;

    /**
     * 规则目标实体
     */
    private Object ruleTarget;

    /**
     * 操作类型（1-自定义，2-匹配字段）
     */
    @NotNull(message = "操作类型不能为空")
    private Integer matchingType;

    /**
     * 变更类型 （1-添加数据，2-更新已有数据，3-覆盖数据）
     */
    @NotNull(message = "变更类型不能为空")
    private Integer changeType;

    /**
     * 上级规则id
     */
    private Long parentRobotRuleId;

    /**
     * 规则源id
     */
    private Long ruleSourceId;

    /**
     * 规则源实体
     */
    private Object ruleSource;

    /**
     * 默认值
     */
    private List<ControlDataValueDTO> values;

    /**
     * 子级规则
     */
    @Valid
    private List<RobotRuleDTO> children;

    public RobotRuleDTO() {
        this.parentRobotRuleId = 0L;
        this.values = new ArrayList<>();
        this.children = new ArrayList<>();
    }

    public RobotRuleDTO copy() {
        RobotRuleDTO robotRule = BeanUtil.copyProperties(this, RobotRuleDTO.class);
        robotRule.setValues(ControlDataValueDTO.copy(this.values));
        robotRule.setChildren(this.children.stream().map(RobotRuleDTO::copy).collect(Collectors.toList()));
        return robotRule;
    }

    public static List<RobotRuleDTO> copy(List<RobotRuleDTO> robotRules) {
        return robotRules.stream().map(e -> e.copy()).collect(Collectors.toList());
    }
}
